4 dp[i][j] = Mínimo costo de partir la cadena entre las particiones i e j, ambas incluídas.
11 while (scanf("%d %d", &n
, &m
)==2){
13 for (int i
=1; i
<=m
; ++i
){
19 for (int i
=0; i
<m
; ++i
){
23 for (int i
=m
-2; i
>=0; --i
){
24 for (int j
=i
+2; j
<m
; ++j
){
27 for (int k
=i
+1; k
<j
; ++k
){
28 t
= min(t
, dp
[i
][k
] + dp
[k
][j
]);
34 printf("%d\n", dp
[0][m
-1]);
43 dp[i][j] = Mínimo costo de partir la cadena entre las particiones i e j, ambas incluídas.
44 pivot[i][j] = Índice de la partición que usé para lograr dp[i][j].
46 int dp
[1005][1005], pivot
[1005][1005];
51 while (scanf("%d %d", &n
, &m
)==2){
53 for (int i
=1; i
<=m
; ++i
){
59 for (int i
=0; i
<m
-1; ++i
){
62 for (int i
=0; i
<m
-2; ++i
){
63 dp
[i
][i
+2] = p
[i
+2] - p
[i
];
67 for (int d
=3; d
<m
; ++d
){ //d = longitud
68 for (int j
, i
=0; (j
= i
+ d
) < m
; ++i
){
69 dp
[i
][j
] = p
[j
] - p
[i
];
71 for (int k
=pivot
[i
][j
-1]; k
<=pivot
[i
+1][j
]; ++k
){
72 int x
= dp
[i
][k
] + dp
[k
][j
];
73 if (x
< t
) t
= x
, s
= k
;
75 dp
[i
][j
] += t
, pivot
[i
][j
] = s
;
79 printf("%d\n", dp
[0][m
-1]);